[BUUCTF]看我回旋踢
题目就是一段密文
1 | synt{5pq1004q-86n5-46q8-o720-oro5on0417r1} |
看这格式, 大胆的猜测, 这就是经过某种变换后的flag
这synt
自然就是就是flag
变换来的了,
那是怎么变换来的呢? 我们可以先自己对比一下ASCII
码,
看看能不能找到规律, 就拿"synt"和"flag"对比, 写个脚本:
1 | def show_ascii(*args): |
显而易见, 密文就是把明文的字符的ASCII
码逐个加+13得来的,
那么写出解密脚本
1 | res = '' |
? ? ?
什么鬼?! 这显然是错的,
看样子不能单纯在ASCII
码上+13就完事了
经过一番查找, 得知此题的变换方式方式称为ROT13(Rotate by 13 places; 回转13位)
ROT13
和它的兄弟们:ROT5: 只对数字进行编码, 用当前数字往前数的第5个数字替换当前数字, 例如当前为
0
, 编码后变成5
, 当前为1
, 编码后变成6
, 以此类推顺序循环.ROT13: 只对字母进行编码, 用当前字母往前数的第13个字母替换当前字母, 例如当前为
A
, 编码后变成N
, 当前为B
, 编码后变成O
, 以此类推顺序循环.ROT18: 这是一个异类, 本来没有, 它是将ROT5和ROT13组合在一起, 为了好称呼, 将其命名为ROT18.
ROT47: 对数字、字母、常用符号进行编码, 按照它们的
ASCII
码进行位置替换,用当前字符ASCII
码往前数的第47位对应字符替换当前字符, 例如当前为小写字母z
, 编码后变成大写字母K
, 当前为数字0
, 编码后变成符号_
, 用于ROT47编码的字符其ASCII
码范围是33-126, 具体可参考ASCII码一览表.
所以这题正确的解密方式就是把字母(除字母外的字符保持不变)移+13位, 到了末尾又从头循环, 那么我们只要仿照这个原理写出解密脚本应该就没问题了.
1 | def shift(myChar, offset): |